home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack7b.sfx
/
hack#7d.txt
< prev
next >
Wrap
Text File
|
1990-02-12
|
40KB
|
898 lines
WILL CONTAIN INFORMATION; THE REST OF THE FIELDS SHOULD BE IGNORED.
┼ACH SUBSEQUENT CALL TO THIS ROUTINE WILL RETURN THE NEXT DIRECTORY
ENTRY IN THE DIRECTORY. ┴LL OF THE "DIRENT" FIELDS WILL BE VALID FOR
THESE.
╘HEN, AFTER ALL DIRECTORY ENTRIES HAVE BEEN READ THROUGH, THE LAST CALL
WILL RETURN A DIRECTORY ENTRY WITH A NULL (ZERO-LENGTH) NAME. ╘HIS
CORRESPONDS TO THE "BLOCKS FREE" LINE IN A ├OMMODORE DISK DIRECTORY
LISTING. ╘HE "ACE─IRENT┬YTES" FIELD FOR THIS LAST ENTRY WILL BE SET TO
THE NUMBER OF BYTES AVAILABLE FOR STORAGE ON THE DISK. ╧N A ├OMMODORE
DISK DRIVE, THIS WILL BE THE NUMBER OF BLOCKS FREE MULTIPLIED BY 254.
┴FTER READING THIS LAST ENTRY, YOU SHOULD CLOSE THE DIRECTORY.
┴T ANY TIME, IF SOMETHING BIZARRE HAPPENS TO THE LISTING FROM THE DISK
THAT IS NOT CONSIDERED AN ERROR (╔ DON'T ACTUALLY KNOW IF THIS IS
POSSIBLE OR NOT), THEN THE .┌ FLAG WILL BE SET, INDICATING THE ABRUPT
ENDING OF THE DIRECTORY LISTING.
╬┴═┼ : ISDIR
╨╒╥╨╧╙┼: DETERMINE WHETHER THE GIVEN PATHNAME IS FOR A FILE OR A DIRECTORY
┴╥╟╙ : (ZP) = PATHNAME
╥┼╘╒╥╬╙: .┴ = DEVICE IDENTIFIER
.╪ = IS A DISK DEVICE FLAG
.┘ = IS A DIRECTORY FLAG
.├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : ERRNO
╟IVEN A PROPERLY FORMATTED DIRECTORYNAME OR FILENAME, THIS ROUTINE WILL
RETURN WHETHER THE NAME IS FOR A FILE OR A DIRECTORY, WHETHER THE DEVICE
OF THE FILE OR DIRECTORY IS A DISK OR CHARACTER DEVICE, AND THE SYSTEM
IDENTIFIER FOR THE DEVICE. ╘HE TWO FLAGS RETURN $╞╞ FOR TRUE AND $00
FOR FALSE. ╘HE DEVICE IDENTIFIER IS SUPERFLUOUS FOR NOW, BUT A
"DEVINFO" CALL MAY BE ADDED LATER. ╬OTE THAT THIS FILE DOES NOT INDICATE
WHETHER THE FILE/DIRECTORY ACTUALLY EXISTS OR NOT.
╬┴═┼ : CHDIR
╨╒╥╨╧╙┼: CHANGE THE CURRENT WORKING DIRECTORY
┴╥╟╙ : (ZP) = NEW DIRECTORY PATHNAME
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
├HANGES THE CURRENT WORKING DIRECTORY TO THE NAMED DIRECTORY. ╘OO BAD
THE ├OMMODORE ╦ERNAL DOESN'T HAVE A SIMILAR CALL. ╒NLIKE THE "CD" SHELL
COMMAND, THE ARGUMENT HAS TO BE A PROPERLY FORMATTED DIRECTORY NAME.
╬OTE THAT ONLY DIRECTORIES IN NATIVE PARTITIONS ON ├═─ DEVICES ARE
SUPPORTED BY THIS COMMAND; THE 1581'S CRUMMY IDEA OF PARTITIONS IS NOT
SUPPORTED.
╬┴═┼ : CDHOME
╨╒╥╨╧╙┼: CHANGE THE CURRENT WORKING DIRECTORY BACK TO THE "HOME" DIRECTORY
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
├HANGES THE CURRENT WORKING DIRECTORY BACK TO THE "HOME" DIRECTORY THAT
IS DEFINED IN THE "CONFIG.SYS" FILE AS THE INITIAL DIRECTORY.
╬┴═┼ : MKDIR
╨╒╥╨╧╙┼: CREATE A NEW DIRECTORY
┴╥╟╙ : (ZP) = PATHNAME OF NEW DIRECTORY
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
├REATES A NEW DIRECTORY. ╔'M NOT SURE, BUT ╔ THINK THAT THE CURRENT
DIRECTORY HAS TO BE THE PARENT DIRECTORY OF THE DIRECTORY YOU WANT TO
CREATE. ╘HIS MAY BE REQUIRED BY ├═─ DEVICES, WHICH WILL BE THE LOWEST
COMMON DENOMINATOR FOR DIRECTORY SUPPORT. [╬OTE: THIS CALL IS NOT
IMPLEMENTED IN ╥ELEASE #9].
╬┴═┼ : RMDIR
╨╒╥╨╧╙┼: DELETE AN EMPTY EXISTING DIRECTORY
┴╥╟╙ : (ZP) = PATHNAME OF EMPTY DIRECTORY TO REMOVE
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
─ELETES AN EXISTING DIRECTORY. ╘HE DIRECTORY MUST BE EMPTY (HAVE NO
DIRECTORY ENTRIES) IN ORDER FOR THIS COMMAND TO SUCCEED. ┴GAIN, ╔ AM
PRETTY SURE THAT YOU HAVE TO BE "IN" THE PARENT DIRECTORY OF THE ONE TO
BE DELETED, SINCE THIS IS PROBABLY REQUIRED BY ├═─ DEVICES. [╬OTE: THIS
CALL IS NOT IMPLEMENTED IN ╥ELEASE #9].
2.3. ═┼═╧╥┘ ├┴╠╠╙
╘HE CALLS GIVEN IN THIS SECTION ARE TO BE USED FOR ACCESSING "FAR"
MEMORY IN ┴├┼, WHICH INCLUDES ALL ╥┼╒, ╥┴═╠INK, ╥┴═1 AND ABOVE, AND
SECTIONS OF ╥┴═0 THAT ARE NOT IN THE APPLICATION PROGRAM AREA.
┴PPLICATIONS ARE NOT ALLOWED TO ACCESS "FAR" MEMORY DIRECTLY, BECAUSE
THE PRACTICE OF BYPASSING THE OPERATING SYSTEM WOULD UNDOUBTEDLY LEAD TO
PROBLEMS (CAN YOU SAY "═╙-─╧╙"?).
┴LL OF THESE CALLS USE A 32-BIT POINTER THAT IS STORED IN THE ZERO-PAGE
ARGUMENT FIELD "MP" (MEMORY POINTER). ╘HIS FIELD IS TO BE INTERPRETED
AS CONSISTING OF LOW AND HIGH WORDS. ╘HE LOW WORD, WHICH OF COURSE COME
FIRST, IS THE OFFSET INTO THE MEMORY "BANK" THAT IS CONTAINED IN THE
HIGH WORD. ╒SERS MAY ASSUME THAT OFFSETS WITHIN A BANK ARE CONTINUOUS,
SO OPERATIONS LIKE ADDITION MAY BE PERFORMED WITHOUT FEAR ON OFFSETS, TO
ACCESS SUBFIELDS OF A STRUCTURE, FOR EXAMPLE. ┘OU MAY NOT, HOWEVER,
MAKE ANY INTERPRETATION OF THE BANK WORD. ┴N APPLICATION SHOULD ONLY
ACCESS FAR MEMORY THAT IT HAS ALLOCATED FOR ITSELF VIA THE "PAGEALLOC"
CALL.
╬┴═┼ : ZPLOAD
┴╥╟╙ : [MP] = SOURCE FAR MEMORY POINTER
.╪ = DESTINATION ZERO-PAGE ADDRESS
.┘ = TRANSFER LENGTH
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╠OAD ZERO-PAGE LOCATIONS WITH THE CONTENTS OF FAR MEMORY. "MP", OF
COURSE, GIVES THE ADDRESS OF THE FIRST BYTE OF FAR MEMORY TO BE
RETRIEVED. ╘HE ╪ REGISTER IS LOADED WITH THE FIRST ADDRESS OF THE
STORAGE SPACE FOR THE DATA ON ZERO PAGE. ╔T MUST BE IN THE APPLICATION
ZERO-PAGE SPACE. ╘HE ┘ REGISTER HOLDS THE NUMBER OF BYTES TO BE
TRANSFERRED, WHICH, CONSIDERING THAT TRANSFERS MUST BE TO THE
APPLICATION ZERO-PAGE STORAGE, MUST BE 126 BYTES OR LESS. ╘HIS ROUTINE
WILL RETURN A "REFERENCE THROUGH NULL POINTER" IF [MP] CONTAINS A NULL
POINTER.
╬┴═┼ : ZPSTORE
┴╥╟╙ : .╪ = SOURCE ZERO-PAGE ADDRESS
[MP] = DESTINATION FAR MEMORY POINTER
.┘ = TRANSFER LENGTH
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS ROUTINE IS THE COMPLEMENT OF "ZPLOAD"; THIS TRANSFERS DATA FROM
ZERO PAGE TO FAR MEMORY. ╘HE ARGUMENTS AND RESTRICTIONS ARE THE SAME AS
"ZPLOAD".
╬┴═┼ : FETCH
┴╥╟╙ : [MP] = SOURCE FAR MEMORY POINTER
(ZP) = DESTINATION ╥┴═0 POINTER
.┴┘ = TRANSFER LENGTH
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS ROUTINE WILL FETCH UP TO 64╦ OF DATA FROM FAR MEMORY INTO ╥┴═0
MEMORY WHERE IT CAN BE ACCESSED DIRECTLY BY THE PROCESSOR. ╘HE
ARGUMENTS SHOULD MOSTLY SPEAK FOR THEMSELVES. ┘OU SHOULD NOT FETCH INTO
╥┴═0 MEMORY THAT IS NOT SPECIFICALLY ALLOCATED TO THE APPLICATION. ┘OU
WILL GET AN ERROR IF YOU TRY TO USE A NULL FAR POINTER.
╬┴═┼ : STASH
┴╥╟╙ : (ZP) = SOURCE ╥┴═0 POINTER
[MP] = DESTINATION FAR MEMORY POINTER
.┴┘ = TRANSFER LENGTH
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS IS THE COMPLEMENT OF "FETCH" AND OPERATES ANALOGOUSLY, EXCEPT THAT
IT TRANSFERS DATA FROM ╥┴═0 TO FAR MEMORY.
╬┴═┼ : PAGEALLOC
┴╥╟╙ : .┴ = REQUESTED NUMBER OF PAGES TO BE ALLOCATED
.╪ = STARTING "TYPE" OF MEMORY TO SEARCH
.┘ = ENDING "TYPE" OF MEMORY TO SEARCH, INCLUSIVE
╥┼╘╒╥╬╙: [MP] = FAR MEMORY POINTER TO START OF ALLOCATED MEMORY
.├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS ROUTINE ALLOCATES A GIVEN NUMBER OF CONTIGUOUS FAR-MEMORY PAGES FOR
USE BY THE APPLICATION, AND RETURNS A POINTER TO THE FIRST BYTE OF THE
FIRST PAGE. ╧N CALLING, THE ACCUMULATOR CONTAINS THE NUMBER OF PAGES TO
ALLOCATE (A PAGE IS 256 CONTIGUOUS BYTES ALIGNED ON A 256-BYTE ADDRESS
(I.E., THE LOW BYTE OF A PAGE ADDRESS IS ALL ZEROS)).
╘HE ╪ AND ┘ REGISTERS CONTAIN THE START AND END "TYPES" OF FAR MEMORY TO
SEARCH FOR THE REQUIRED ALLOCATION. ╘HE POSSIBLE TYPES ARE MENTIONED IN
THE ╙YSTEM ├ONSTANTS SECTION. ╘HE NUMERIC VALUES FOR THE "ACE═EM"
CONSTANTS ARE ARRANGED IN ORDER OF ACCESSING SPEED. ╙O, IF YOUR
APPLICATION HAS SPEED REQUIREMENTS THAT DICTATE, FOR EXAMPLE, THAT
╥┴═╠INK MEMORY SHOULD NOT BE USED, THEN YOU WOULD CALL "PAGEALLOC" WITH
A SEARCH RANGE OF .╪=0 TO .┘=ACE═EM╔NTERNAL. ╔F YOU WANTED TO SAY YOU
ARE WILLING TO ACCEPT ANY MEMORY THE SYSTEM CAN GIVE TO YOU, YOU WOULD
SPECIFY .╪=0 TO .┘=255. ╘HE VALUES OF 0 AND 255 WILL BE CONVERTED TO
THE FASTEST AND SLOWEST MEMORY AVAILABLE. ┴├┼ WILL GIVE YOU THE FASTEST
TYPE OF MEMORY, FROM WHAT YOU SPECIFY AS ACCEPTABLE, THAT IT CAN. ╔F
YOU HAD AN APPLICATION THAT YOU DIDN'T WANT TO WASTE THE HIGH-SPEED
MEMORY ON, YOU COULD FIRST CALL "PAGEALLOC" ASKING FOR SLOW MEMORY, SUCH
AS .╪=ACE═EM╥╠╥┼╒ TO .┘=255, AND IF THERE IS NONE OF THAT TYPE OF MEMORY
LEFT, MAKE ANOTHER CALL WITH .╪=0 TO .┘=ACE═EM╥╠╥┼╒-1.
╘HIS ROUTINE WILL THEN SEARCH ITS AVAILABLE FREE MEMORY FOR A CHUNK
FITTING YOUR SPECIFICATIONS. ╔F IT CANNOT FIND ONE, THE ROUTINE WILL
RETURN A "INSUFFICIENT MEMORY" ERROR AND A NULL POINTER. ╬OTE THAT THIS
ERROR MAY OCCUR IF THERE IS ACTUALLY THE CORRECT AMOUNT OF MEMORY FREE
BUT JUST NOT IN A BIG ENOUGH CONTIGUOUS CHUNK. ╔F SUCCESSFUL, THIS
ROUTINE WILL RETURN IN "MP" A POINTER TO THE FIRST BYTE OF THE FIRST
PAGE OF THE ALLOCATED MEMORY.
╔F YOU CALL A SUBPROGRAM WITH THE "EXEC" CALL WHILE THE CURRENT PROGRAM
IS HOLDING FAR MEMORY, THAT FAR MEMORY WILL BE KEPT ALLOCATED TO YOUR
PROGRAM AND WILL BE SAFE WHILE THE CHILD PROGRAM IS EXECUTING. ╔F YOU
DON'T DEALLOCATE THE MEMORY WITH "PAGEFREE" BEFORE EXITING BACK TO YOUR
PARENT PROGRAM, THEN THE SYSTEM WILL AUTOMATICALLY DEALLOCATE ALL MEMORY
ALLOCATED TO YOU. ╙O, HAVE NO FEAR ABOUT CALLING "EXIT" IF YOU ARE IN
THE MIDDLE OF COMPLICATED FAR MEMORY MANIPULATION WHEN A FATAL ERROR
CONDITION IS DISCOVERED AND YOU DON'T FEEL LIKE FIGURING OUT WHAT MEMORY
YOUR PROGRAM OWNS AND DEALLOCATING IT.
╙OME APPLICATIONS WILL WANT TO HAVE THE MOST AMOUNT OF MEMORY TO WORK
WITH, AND IF THERE IS FREE SPACE IN THE APPLICATION PROGRAM AREA THAT
THE PROGRAM IS NOT USING DIRECTLY, THEN YOU MAY WANT TO USE THAT AS
"FAR" MEMORY. ╘O DO THIS, YOU WILL NEED TO WRITE YOUR OWN STUB ROUTINES
THAT MANAGE PAGE ALLOCATION AND DEALLOCATION REQUESTS TO THE NEAR
MEMORY, AND CALLS THE "PAGEALLOC" AND "PAGEFREE" ROUTINES TO MANAGE THE
FAR MEMORY. ╘HE "SORT" PROGRAM DISTRIBUTED WITH ┴├┼ DOES THIS. ╨LEASE
NOTE THAT YOU ├┴╬╬╧╘ SIMPLY FREE THE UNUSED MEMORY OF THE APPLICATION
PROGRAM AREA AND EXPECT THE SYSTEM TO MANAGE IT. ┬AD STUFF WOULD
HAPPEN.
╙OME APPLICATIONS WILL WANT TO HAVE A BYTE-ORIENTED MEMORY ALLOCATION
SERVICE RATHER THAN A PAGE-ORIENTED SERVICE. ┘OU CAN BUILD A
BYTE-ORIENTED SERVICE ON TOP OF THE PAGE-ORIENTED SERVICE IN YOUR
APPLICATION PROGRAMS THAT MANAGE MEMORY FOR THE APPLICATION AND ASK THE
SYSTEM FOR PAGES WHENEVER MORE MEMORY IS REQUIRED BY THE APPLICATION.
╬OTE THAT THIS STILL MEANS THAT ALLOCATED MEMORY WILL BE FREED
AUTOMATICALLY WHEN AN APPLICATION EXITS. ╘HE "SORT" PROGRAM IMPLEMENTS
THIS BYTE-ORIENTED SERVICE, SO YOU CAN CHECK ITS SOURCE CODE TO SEE HOW
THIS IS DONE (OR TO SIMPLY CUT AND PASTE THE CODE INTO YOUR OWN
PROGRAM).
╬┴═┼ : PAGEFREE
┴╥╟╙ : [MP] = FAR MEMORY POINTER TO START OF MEMORY TO BE FREED
.┴ = NUMBER OF PAGES TO BE FREED
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS DEALLOCATES MEMORY THAT WAS ALLOCATED TO A PROCESS BY USING THE
"PAGEALLOC" SYSTEM CALL. ┘OU WILL GET AN ERROR RETURN IF YOU TRY TO
DEALLOCATE MEMORY THAT YOU DON'T OWN.
2.4. ╙├╥┼┼╬ ├╧╬╘╥╧╠ ├┴╠╠╙
╘HIS SECTION DESCRIBES THE SYSTEM CALLS THAT ARE AVAILABLE TO
APPLICATION PROGRAMMERS FOR FULL-SCREEN APPLICATIONS. ╘HESE CALLS ARE
INTENDED TO BE GENERAL ENOUGH TO HANDLE DIFFERENT SCREEN HARDWARE (THE
╓╔├ AND ╓─├ CHIPS AND A ╓╔├ SOFT-80-COLUMN BITMAP SCREEN, AND POSSIBLY
OTHERS). ╘HESE CALLS ARE ALSO DESIGNED TO BE EFFICIENT AS POSSIBLE, TO
DISCOURAGE PROGAMMERS FROM ATTEMPTING TO BYPASS USING THEM. ┬YPASSING
THESE CALLS WOULD BE A BAD THING.
╘HE CALLS ARE DESIGNED AROUND THE ├-128/╨┼╘ CONCEPT OF A WINDOW. ╘HERE
IS ONLY ONE ACTIVE WINDOW ON THE DISPLAY AT A TIME, WHICH MAY BE IS
LARGE AS THE ENTIRE SCREEN OR AS SMALL AS 1X1 CHARACTER CELLS. ╘HIS
WINDOW IS VERY CHEAP TO SETUP AND TEAR DOWN. ┴N APPLICATION CAN HAVE
MULTIPLE WINDOWS ON THE SCREEN BY SWITCHING THE ACTIVE WINDOW AROUND.
╔N THE CALLS BELOW, ALL MENTION OF "SW" IN THE ARGUMENTS AND RETURN
VALUES REFER TO THE "SYSWORK" ARRAY. ╞OR MANY CALLS, THERE IS A
"CHAR/COLOR/ HIGH-ATTRIBUTE" ARGUMENT. ╘HIS ARGUMENT DETERMINES WHICH
PARTS OF A SCREEN LOCATION WILL BE MODIFIED. ╘HERE ARE THREE COMPONENTS
TO EACH SCREEN LOCATION: THE CHARACTER CODE, THE COLOR CODE, AND THE
HIGH-ATTRIBUTES. ╘HE CHARACTER CODE IS EXACTLY THE SAME AS THE ╨┼╘╙├╔╔
CODE FOR THE CHARACTER THAT YOU WANT TO DISPLAY (UNLIKE THE SCREEN-CODE
ARRANGEMENT THAT ├OMMODORE CHOSE). ╘HERE ARE 128 INDIVIDUAL CHARACTERS
IN THE NORMAL ╨┼╘╙├╔╔ POSITIONS, AND 128 REVERSED IMAGES OF THE
CHARACTERS IN THE MOST SENSIBLE OTHER POSITIONS. ╘HE CODES ARE AS
FOLLOWS:
├╧─┼╙ (HEX) ─┼╙├╥╔╨╘╔╧╬
----------- -----------
$00-$1F REVERSE LOWERCASE LETTERS
$20-$3F DIGITS AND PUNCTUATION
$40-$5F LOWERCASE LETTERS
$60-$7F REVERSE GRAPHICS CHARACTERS
$80-$9F REVERSE UPPERCASE LETTERS
$A0-$BF GRAPHICS CHARACTERS
$C0-$DF UPPERCASE LETTERS
$E0-$EF REVERSE DIGITS AND PUNCTUATION
╘HERE ARE SIXTEEN COLOR CODES, OCCUPYING THE LOWER FOUR BITS OF THE COLOR
VALUE. ╘HESE ARE ╥╟┬╔ CODES, AS FOLLOWS:
├╧─┼(DEC) (HEX) (BIN) ─┼╙├╥╔╨╘╔╧╬
--------- ----- -RGBI -----------
0 $0 %0000 BLACK
1 $1 %0001 DARK GREY
2 $2 %0010 BLUE
3 $3 %0011 LIGHT BLUE
4 $4 %0100 GREEN
5 $5 %0101 LIGHT GREEN
6 $6 %0110 DARK CYAN ON ╓─├, MEDIUM GREY ON ╓╔├-╔╔
7 $7 %0111 CYAN
8 $8 %1000 RED
9 $9 %1001 LIGHT RED
10 $A %1010 PURPLE
11 $B %1011 LIGHT PURPLE ON ╓─├, ORANGE ON ╓╔├-╔╔
12 $C %1100 BROWN
13 $D %1101 YELLOW
14 $E %1110 LIGHT GREY
15 $F %1111 WHITE
╞INALLY, THERE ARE THE HIGH-ATTRIBUTE BITS. ╘HESE OCCUPY THE FOUR MOST
SIGNIFICANT BITS OF THE COLOR VALUE. ─EPENDING ON THE TYPE OF DISPLAY
(╓╔├ TEXT, ╓─├ TEXT, OR ╓╔├/╓─├ BITMAP), THESE BITS HAVE ONE OF THREE
MEANINGS: CHARACTER ATTRIBUTES, BACKGROUND CHARACTER COLOR, OR NO
EFFECT. ╘HUS, CARE MUST BE TAKEN IN USING THESE BITS; THEY WILL HAVE
DIFFERENT EFFECTS ON DIFFERENT DISPLAYS. ╘HE BACKGROUND CHARACTER CODES
ARE THE SAME AS THE FOREGROUND CHARACTER CODES LISTED ABOVE. ╘HE
CHARACTER ATTRIBUTES HAVE THE FOLLOWING MEANINGS:
┬╔╘ ╓┴╠╒┼ (DEC) (HEX) ─┼╙├╥╔╨╘╔╧╬
-AVUB---- ----- ----- -----------
%10000000 128 $80 ALTERNATE CHARACTERSET (ITALIC)
%01000000 64 $40 REVERSE CHARACTER
%00100000 32 $20 UNDERLINE
%00010000 16 $10 BLINK
╘HESE VALUES ARE ADDITIVE (OR, SHOULD ╔ SAY, "OR-ATIVE"); YOU CAN USE
ANY COMBINATION OF THEM AT ONE TIME. ╬ORMALLY, YOU MAY WISH TO LEAVE
THE HIGH-ATTRIBUTE BITS ALONE, UNLESS YOU TAKE THE VALUES TO GIVE THEM
FROM THE COLOR PALETTES (NEXT SECTION). ╘O SPECIFY WHICH OF YOU WISH TO
HAVE CHANGED, SET BITS IN THE "CHAR/COLOR/HIGH-ATTRIBUTE" ARGUMENT TO
SYSTEM CALLS. ╘HE FLAGS HAVE THE FOLLOWING VALUES. ╘HEY ARE OR-ATIVE
AS WELL:
┬╔╘ ╓┴╠╒┼ (DEC) (HEX) ─┼╙├╥╔╨╘╔╧╬
-CAH----- ----- ----- -----------
%10000000 128 $80 MODIFY CHARACTER
%01000000 64 $40 MODIFY COLOR
%00100000 32 $20 MODIFY HIGH-ATTRIBUTE BITS
╘HE SCREEN CALLS THAT DEAL WITH PLACING CHARACTERS ON THE SCREEN REFER
TO SCREEN LOCATIONS USING ABSOLUTE ADDRESSES OF LOCATIONS IN SCREEN
MEMORY. ╘HIS SCHEME IS USED FOR INCREASED EFFICIENCY. ┘OU CAN OBTAIN
INFORMATION ABOUT THE ABSOLUTE SCREEN ADDRESS OF THE TOP LEFT-HAND
CORNER OF THE CURRENT WINDOW AND THE NUMBER OF SCREEN ADDRESSES BETWEEN
SUCCESSIVE ROWS, TO FIGURE OUT SCREEN ADDRESSES FOR YOUR APPLICATIONS.
╞OR ADDED CONVENIENCE, THERE IS A CALL WHICH WILL ACCEPT ROW AND COLUMN
NUMBERS AND RETURN THE CORRESPONDING ABSOLUTE SCREEN ADDRESS.
╘HE SCREEN-CONTROL SYSTEM CALLS ARE AS FOLLOWS:
╬┴═┼ : WINMAX
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
╙ETS THE CURRENT WINDOW TO COVER THE ENTIRE SCREEN.
╬┴═┼ : WINCLEAR
┴╥╟╙ : .┴ = CHAR/COLOR/HIGH-ATTRIBUTE MODIFICATION FLAGS
.╪ = CHARACTER FILL VALUE
.┘ = COLOR FILL VALUE
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
╘HIS CALL "CLEARS" THE CURRENT WINDOW BY FILLING IT WITH THE
CHARACTER/COLOR YOU SPECIFY. ┘OU CAN USE THE CHAR/COLOR/HI-ATTR TO
LIMIT WHAT GETS CLEARED. [╬OTE: ╘HE ARGUMENTS FOR THIS CALL ARE SLIGHTLY
DIFFERENT IN ╥ELEASE #9].
╬┴═┼ : WINSET
┴╥╟╙ : .┴ = NUMBER OF ROWS IN WINDOW
.╪ = NUMBER OF COLUMNS IN WINDOW
SW+0 = ABSOLUTE SCREEN ROW OF TOP LEFT CORNER OF WINDOW
SW+1 = ABSOLUTE SCREEN COLUMN OF TOP LEFT CORNER OF WINDOW
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╙ETS THE CURRENT WINDOW TO THE SIZE YOU SPECIFY. ┘OU WILL GET AN ERROR
RETURN IF THE WINDOW WILL NOT FIT ON THE SCREEN OR OF IT DOES NOT
CONTAIN AT LEAST ONE CHARACTER. [╬OTE: ╘HIS CALL IS NOT IMPLEMENTED IN
╥ELEASE #9].
╬┴═┼ : WINSIZE
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: .┴ = NUMBER OF ROWS IN WINDOW
.╪ = NUMBER OF COLUMNS IN WINDOW
SW+0 = ABSOLUTE SCREEN ROW OF TOP LEFT CORNER OF WINDOW
SW+1 = ABSOLUTE SCREEN COLUMN OF TOP LEFT CORNER OF WINDOW
(SW+2)= SCREEN ADDRESS OF TOP LEFT CORNER
(SW+4)= SCREEN ADDRESS INCREMENT BETWEEN SUCCESSIVE ROWS ON SCREEN
┴╠╘┼╥╙ : <NONE>
╥ETURNS INFORMATION ABOUT THE CURRENT WINDOW. [╬OTE: THE ARGUMENTS ARE
SLIGHTLY DIFFERENT IN ╥ELEASE #9].
╬┴═┼ : WINPUT
┴╥╟╙ : (SW+0)= ABSOLUTE SCREEN ADDRESS TO START PUTTING DATA AT
(SW+2)= CHARACTER STRING POINTER
.╪ = LENGTH OF CHARACTER STRING
.┘ = COLOR
.┴ = CHAR/COLOR/HIGH-ATTRIBUTE MODIFICATION FLAGS
SW+4 = FILL CHARACTER
SW+5 = TOTAL FIELD LENGTH
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
╨UTS TEXT ONTO THE SCREEN. ╘HE OUTPUT REGION IS GIVEN BY THE ABSOLUTE
STARTING SCREEN ADDRESS AND THE TOTAL FIELD LENGTH. ╘HIS REGION MUST BE
CONTAINED ON ONE LINE OF THE CURRENT WINDOW, OR BAD THINGS WILL HAPPEN.
┴ POINTER TO THE CHARACTERS TO BE PRINTED IS GIVEN, AS WELL AS THE
LENGTH OF THE CHARACTER ARRAY. ├ONTROL CHARACTERS IN THIS STRING ARE
IGNORED; THEY ARE POKED LITERALLY ONTO THE SCREEN, INCLUDING THE NULL
CHARACTER. ╘HE LENGTH OF THE CHARACTER STRING MUST BE LESS THAN OR
EQUAL TO THE TOTAL LENGTH OF THE FIELD. ╥EMAINING SPACES IN THE FIELD
WILL BE FILLED IN WITH THE "FILL CHARACTER".
╘HE COLOR OF THE TOTAL FIELD LENGTH WILL BE FILLED IN WITH "COLOR". ┘OU
CAN USE THE "CHAR/COLOR/HI-ATTR" MODIFICATION FLAGS TO SPECIFY WHAT IS
TO BE CHANGED. ╔F YOU WERE TO, FOR EXAMPLE, SPECIFY THAT THE COLORS OF
THE FIELD ARE NOT TO BE CHANGED, THEN THE CALL WOULD EXECUTE FASTER.
╬┴═┼ : WINCOLOR
┴╥╟╙ : .╪ = NEW ╥╟┬╔ SCREEN COLOR
.┘ = NEW ╥╟┬╔ BORDER COLOR
.┴ = WHICH COLORS TO CHANGE ($80=SCREEN + $40=BORDER)
╥┼╘╒╥╬╙: .╪ = RESULTING ╥╟┬╔ SCREEN COLOR
.┘ = RESULTING ╥╟┬╔ BORDER COLOR
┴╠╘┼╥╙ : .┴
╙ETS THE COLOR OF THE SCREEN AND BORDER. ┘OU MAY OPTIONALLY SET ONE,
THE OTHER, BOTH, OR NEITHER. ╘HE RESULTING COLORS FOR COLORS CHANGED,
AND THE EXISTING COLORS FOR COLORS UNCHANED WILL BE RETURNED. ╬OTE THAT
NOT ALL SCREENS HAVE AN ADJUSTABLE COLOR, SO THE BORDER ARGUMENT MAY BE
IGNORED.
╬┴═┼ : WINPOS
┴╥╟╙ : .┴ = ROW
.╪ = COLUMN
╥┼╘╒╥╬╙: (SW+0)= SCREEN MEMORY ADDRESS OF POSITION
┴╠╘┼╥╙ : .┴, .╪, .┘
╟IVEN A ROW AND COLUMN IN THE CURRENT WINDOW, RETURNS THE CORRESPONDING
ABSOLUTE SCREEN MEMORY LOCATION FOR USE WITH OTHER CALLS. ╬O ERRORS ARE
RETURNED, SO GARBAGE IN, GARBAGE OUT.
╬┴═┼ : WINCURSOR
┴╥╟╙ : (SW+0)= SCREEN ADDRESS TO PLACE CURSOR
.┴ = ENABLE FLAG ($FF=CURSOR-ON / $00=CURSOR-OFF)
.┘ = COLOR TO SHOW CURSOR IN
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
─ISPLAYS OR UNDISPLAYS THE CURSOR AT THE GIVEN SCREEN ADDRESS. ╘HIS
CALL RETURNS IMMEDIATELY IN EITHER CASE. ╬O ERRORS ARE RETURNED. ─O
NOT DISPLAY ANYTHING IN OR SCROLL THE WINDOW WHILE THE CURSOR IS BEING
DISPLAYED, DO NOT DISPLAY THE CURSOR TWICE, AND DO NOT UNDISPLAY THE
CURSOR TWICE IN A ROW OR BAD THINGS WILL HAPPEN. ┴LSO, MAKE SURE YOU
GIVE THE SAME ADDRESS WHEN UNDISPLAYING THE CURSOR AS YOU DID WHEN
DISPLAYING THE CURSOR. ╫HEN THE SYSTEM STARTS, THE CURSOR WILL BE IN
ITS UNDISPLAYED STATE (DUH!). ┘OU ALSO GET TO SPECIFY THE COLOR YOU
WANT THE CURSOR TO BE SHOWN IN. ╘HE HIGH-ATTRIBUTE BITS OF THIS COLOR
ARE IGNORED.
╬┴═┼ : WINSCROLL
┴╥╟╙ : .┴ = FLAGS: CHAR/COLOR/HI-ATTR + $08=UP + $04=DOWN
.╪ = NUMBER OF ROWS TO SCROLL UP/DOWN
SW+4 = FILL CHARACTER
.┘ = FILL COLOR
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
╙CROLLS THE CONTENTS OF THE CURRENT WINDOW UP OR DOWN. ┘OU CAN SCROLL
ANY NUMBER OF ROWS AT A TIME. ┴FTER SCROLLING, THE BOTTOM (OR TOP) ROWS
WILL BE FILLED WITH THE FILL CHARACTER AND COLOR. ┘OU CAN LIMIT WHETHER
THE CHARACTERS AND/OR COLORS ARE TO BE SCROLLED BY USING THE "FLAGS"
BYTE IN THE USUAL WAY. ╙CROLLING ONLY THE CHARACTERS, FOR EXAMPLE, WILL
BE TWICE AS FAST AS SCROLLING BOTH CHARACTERS AND ATTRIBUTES. ╫HETHER
TO SCROLL UP OR DOWN IS SPECIFIED ALSO USING BITS IN THE "FLAGS" FIELD,
AS INDICATED IN THE INPUT ARGUMENTS ABOVE. ┘OU CAN SPECIFY SCROLLING IN
MORE THAN ONE WAY, AND THE RESULT WILL BE TO SCROLL IN EACH SPECIFIED
DIRECTION IN TURN, IN THE ORDER UP, THEN DOWN. ╔N THE FUTURE, SCROLLING
LEFT AND RIGHT MAY BE ADDED TO THIS CALL. [╬OTE: ╘HE ARGUMENTS AND
SEMANTICS OF THIS CALL ARE A LITTLE DIFFERENT IN ╥ELEASE #9].
2.5. ├╧╬╙╧╠┼ ├┴╠╠╙
╘HE CALLS IN THIS SECTION REFER TO THE SYSTEM "CONSOLE", WHICH INCLUDES
THE SCREEN AND KEYBOARD. ╘HE SCREEN-RELATED CALLS ARE AT A HIGHER LEVEL
THAN THE CALLS IN THE PREVIOUS SECTION.
╬┴═┼ : STOPKEY
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: .├╙ = STOP KEY PRESSED
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╔NDICATES WHETHER THE ╙╘╧╨ (╥╒╬/╙╘╧╨) KEY IS CURRENTLY BEING HELD DOWN
BY THE USER. ╔F SO, CARRY FLAG IS SET ON RETURN (AND CLEAR IF NOT). ╔F
THE STOP KEY IS DISCOVERED TO BE PRESSED BY THIS CALL, THEN THE KEYBOARD
BUFFER WILL ALSO BE CLEARED.
╬┴═┼ : GETKEY
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: .┴ = KEYBOARD CHARACTER
┴╠╘┼╥╙ : .╪, .┘
╫AITS FOR THE USER TO TYPE A KEY (OR TAKES A PREVIOUS KEYSTROKE FROM THE
KEYBOARD BUFFER). ╥EGULAR CHARACTERS ARE RETURNED IN THEIR REGULAR
╨┼╘╙├╔╔ CODES, BUT THERE ARE MANY SPECIAL CONTROL KEYSTROKES. ╘HEY ARE
NOT LISTED HERE (YET) BECAUSE ╔ HAVEN'T FIGURED OUT WHAT ALL OF THE
SPECIAL CODES SHOULD BE, BUT ALL 256 POSSIBLE CHARACTER VALUES WILL BE
COVERED. ╙PECIAL CODES LIKE "PAGE UP", ETC. SHOULD HELP IN
STANDARDIZING CONTROL KEYSTROKES FOR APPLICATIONS. ╘HE KEY CODE IS
RETURNED IN THE ACCUMULATOR. ╬O ERRORS ARE POSSIBLE.
╬┴═┼ : CONCOLOR
┴╥╟╙ : .┴ = WHICH COLORS TO MODIFY: $02=CHARACTER + $01=CURSOR
+ $80=MODIFY HIGH-ATTRIBUTES OF COLORS
.╪ = NEW ╥╟┬╔ CHARACTER COLOR
.┘ = NEW ╥╟┬╔ CURSOR COLOR
╥┼╘╒╥╬╙: .╪ = RESULTING CHARACTER COLOR
.┘ = RESULTING CURSOR COLOR
┴╠╘┼╥╙ : .┴
╙ETS THE CHARACTER AND CURSOR COLORS TO BE USED BY THE CONSOLE FOR THE
"READ" AND "WRITE" SYSTEM CALLS THAT REFER TO FILES OPENED TO THE
CONSOLE DEVICE. ┘OU CAN USE THE FLAGS ARGUMENT TO LIMIT WHAT GETS
CHANGED. [╬OTE: FLAGS ARGUMENT IS SLIGHTLY DIFFERENT IN ╥ELEASE #9].
╬┴═┼ : CONPALETTE
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: SW+0 = MAIN CHARACTER COLOR
SW+1 = CURSOR COLOR
SW+2 = STATUS CHARACTER COLOR
SW+3 = SEPARATOR CHARACTER COLOR
SW+4 = HIGHLIGHT CHARACTER COLOR
SW+5 = ALERT CHARACTER COLOR
SW+6 = SCREEN BORDER COLOR
SW+7 = SCREEN BACKGROUND COLOR
┴╠╘┼╥╙ : .┴, .╪, .┘
╥ETURNS THE PALETTE OF COLORS THAT ARE RECOMMENDED TO BE USED IN
APPLICATIONS. ╘HESE COLORS ARE CHOSEN BY THE USER IN THE SYSTEM
CONFIGURATION, SO THEY CAN BE INTERPRETED AS BEING WHAT THE USER WANTS
AND EXPECTS APPLICATIONS TO USE. ┴ DIFFERENT SELECTION IS MADE BY THE
USER FOR EACH DIFFERENT SCREEN TYPE, AND THE PALETTE RETURNED WILL BE
FOR THE SCREEN TYPE CURRENTLY IN USE. ╘HE HIGH-ATTRIBUTE BITS OF THESE
COLORS ARE VALID. ┼IGHT COLORS ARE INCLUDED IN THE PALETTE, AND YOU MAY
INTERPRET THEIR MEANING ACCORDING TO THE APPLICATION. ╘HE SUGGESTED
USAGES ARE GIVEN IN THE RETURN ARGUMENTS LISTED ABOVE.
╬┴═┼ : CONSCREEN
┴╥╟╙ : .┴ = NUMBER OF TEXT ROWS REQUIRED, MINIMUM
.╪ = NUMBER OF TEXT COLUMNS REQUIRED, MINIMUM
╥┼╘╒╥╬╙: .┴ = NUMBER OF TEXT ROWS YOU GET
.╪ = NUMBER OF TEXT COLUMNS YOU GET
.├╙ = ERROR OCCURRED FLAG (REQUESTED SIZE CANNOT BE GIVEN)
┴╠╘┼╥╙ : .┘, ERRNO
╘HIS CALL SELECTS AN APPROPRIATE DISPLAY DEVICE, SCREEN, AND LAYOUT FOR
DISPLAYING TEXT. ┘OU ASK FOR THE MINIMUM NUMBER OF ROWS AND COLUMNS YOU
REQUIRE ON THE SCREEN, AND THE CALL RETURNS TO YOU WHAT YOU RECEIVE. ╔F
THE SYSTEM CANNOT MATCH YOUR MINIMUM REQUIREMENTS, AN ERROR WILL BE
RETURNED, AND THE CURRENT SCREEN WILL BE UNCHANGED. ╘HE CLOCK SPEED OF
THE PROCESSOR WILL BE CHANGED TO MATCH THE SCREEN SELECTED, IF
APPROPRIATE.
╬┴═┼ : CONPOS
┴╥╟╙ : .┴ = ROW
.╪ = COLUMN
╥┼╘╒╥╬╙: .├╙ = ERROR ENCOUNTERED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘
╘HIS CALL WILL SET THE SCREEN LOCATION THAT THE NEXT CONSOLE "READ" OR
"WRITE" SYSTEM CALL WILL OPERATE FROM. ╔F THE "CURSOR" POSITION IS
OUTSIDE THE BOUNDARIES OF THE CURRENT WINDOW ON THE SCREEN, AN ERROR
WILL BE RETURNED. [╬OTE: THIS FUNCTION IS NOT IMPLEMENTED IN ╥ELEASE
#9].
2.6. ╨╥╧├┼╙╙ ├╧╬╘╥╧╠ ├┴╠╠╙
╘HIS SECTION DESCRIBES CALLS THAT ARE USED TO CONTROL THE EXECUTION OF
PROCESSES (ACTIVE PROGRAMS). ╞ROM WITHIN ONE PROGRAM, YOU CAN CALL FOR
THE EXECUTION OF ANOTHER PROGRAM, HAVE IT EXECUTE, AND THEN RETURN TO
THE CALLING PROGRAM. ╙INCE ONLY ONE PROGRAM IS ALLOWED IN MEMORY AT A
TIME, SOME SPECIAL PROBLEMS ARISE. ┴LSO, ONLY RUDIMENTARY VERSIONS OF
THESE SYSTEM CALLS ARE IMPLEMENTED IN ╥ELEASE #9 AND ╔ HAVEN'T DECIDED
COMPLETELY HOW THEY SHOULD WORK. ╙O, THIS SECTION IS A BIT TENTATIVE.
╬┴═┼ : EXEC
╨╒╥╨╧╙┼: EXECUTE EXTERNAL PROGRAM AS A CHILD PROCESS
┴╥╟╙ : (ZP) = PROGRAM NAME OF EXECUTABLE
(ZW) = START ADDRESS OF ARGUMENT VECTOR
.┴┘ = NUMBER OF ARGUMENTS
[MP] = POINTER TO FAR MEMORY VOLATILE STORAGE
╥┼╘╒╥╬╙: .┴ = EXIT CODE
.╪ = NUMBER OF BYTES IN "ACE┼XIT─ATA" USED
[MP] = POINTER TO FAR MEMORY VOLATILE STORAGE
.├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┘, ERRNO
├ALLING THIS ROUTINE WILL CAUSE A NEW "FRAME" TO BE SET UP ON THE
"SYSTEM STACK" (LOWERING THE AVAILABLE APPLICATION AREA MEMORY A
LITTLE), THE SPECIFIED PROGRAM TO BE LOADED INTO MEMORY OVER TOP OF THE
CURRENT ONE, THE NEW PROGRAM TO BE EXECUTED, THE OLD PROGRAM TO BE
RELOADED FROM WHATEVER DISK UNIT IT CAME FROM ORIGINALLY UPON EXIT OF
THE NEW PROGRAM, AND CONTROL TO BE RETURNED TO THE OLD PROCESS WITH THE
RETURN VALUES FROM THE EXECUTED PROGRAM. ╘HIS IS A COMPLICATED PROCEDURE
AND MANY THINGS CAN GO WRONG.
╘HE FIRST THING THAT A PROCESS THAT WANTS TO CALL ANOTHER PROGRAM MUST
DO IS SET UP THE ARGUMENTS TO BE PASSED IN. ┴LL ARGUMENTS MUST BE
NULL-TERMINATED STRINGS. ╘HESE ARGUMENTS ARE TO BE PUT INTO HIGH
MEMORY, STARTING FROM ONE LESS THAN THE LOCATION POINTED TO BY
"ACE═EM╘OP" AND WORKING DOWNWARD. ╔T DOES NOT MATTER IN WHICH ORDER THE
STRINGS ARE PLACED, AS LONG AS THEY ARE ALL GROUPED TOGETHER. ╘HEN,
IMMEDIATELY BELOW THE STRINGS COMES THE VECTOR OF TWO-BYTE ╥┴═0 POINTERS
THAT POINT TO THE STRINGS. ╘HIS ARRAY MUST BE IN ORDER, WITH THE LOWEST
ENTRY POINTING TO THE FIRST (ZERO SUBSCRIPT) STRING, ETC., THE SECOND
HIGHEST ENTRY POINTING TO THE LAST STRING, AND THE HIGHEST ENTRY
CONTAINING THE VALUE $0000. ┴N ASCIIGRAM FOLLOWS:
╚╔╟╚┼╥ ┴──╥┼╙╙┼╙
▄ ▄
▄ ▄ <--(ACE═EM╘OP)
+-----------+
▄ ▄
▄ STRING ▄
▄ ▄ : COLLECTION OF NULL-TERMINATED STRINGS
▄ CONTENTS ▄
▄ ▄
▄ ▄
+-----------+
▄ $0000 ▄ : ARGV[╬] : NULL ARGUMENT POINTER
+-----------+
▄ STRPTR╬-1 ▄ : ARGV[╬-1]
+-----------+
▄ STRPTR╬-2 ▄ : ARGV[╬-2]
+-----------+
. .
. .
+-----------+
▄ STRPTR 1 ▄ : ARGV[1] : FIRST ACTUAL ARGUMENT
+-----------+
▄ STRPTR 0 ▄ <--(ZW) : ARGV[0] : FILENAME OF PROGRAM TO BE EXECUTED
+-----------+
▄ ▄
╠╧╫┼╥ ┴──╥┼╙╙┼╙
╘HE FIRST ENTRY SHOULD INDICATE THE FILENAME OR COMMAND NAME OF THE
PROGRAM BEING EXECUTED, AND THE SUBSEQUENT ARGUMENTS ARE THE ACTUAL
INPUT ARGUMENTS TO THE PROGRAM BEING CALLED. ╘HE ADDRESS OF THE FIRST
ARGUMENT VECTOR TABLE ENTRY IS LOADED INTO (ZW), AND THE NUMBER OF
ARGUMENTS IS LOADED INTO .┴┘. ╬OTE THAT THIS VALUE ALSO INCLUDES THE
COMMAND NAME, SO IF, FOR EXAMPLE, YOU WERE TO CALL PROGRAM "WC" TO COUNT
TWO FILENAMES "HELLO" AND "GOODBYE", THEN YOU WOULD PASS AN ARGUMENT
COUNT OF 3. ╘HE NAME POINTED TO BY "ARGV[0]" DOES NOT ACTUALLY HAVE TO
BE THE LITERAL COMMAND NAME, BUT THE ONE POINTED TO BY (ZP) DOES. ╔F A
RELATIVE EXECUTABLE NAME IS GIVEN IN (ZP), THEN THE SEARCH PATH WILL BE
USED TO LOCATE THE EXECUTABLE. ╧H, DON'T SCREW UP THE ORGANIZATION OF
THE ARGUMENTS OR BAD THINGS WILL HAPPEN; THERE IS NO STRUCTURE CHECKING.
┴FTER SETTING UP THE ARGUMENTS, YOU'LL WANT TO SET UP ANY REDIRECTIONS
OF STDIN, STDOUT, OR STDERR YOU'LL BE NEEDING. ┬ECAUSE THERE IS ONLY
ONE OPEN FILE TABLE IN THE WHOLE UNI-TASKING SYSTEM, YOU'LL HAVE TO
MANIPULATE EXISTING ENTRIES USING THE "FDSWAP" SYSTEM CALL DESCRIBED
EARLIER. ╘HE OPEN FILE TABLE IS INHERITED BY THE CHILD PROCESS. ╬OTE
THAT IF IT CLOSES ANY OF THE OPEN FILES IT INHERITED, THEN THEY ARE ALSO
CLOSED TO YOUR USE ALSO. ╔F THE CHILD ACCIDENTALLY LEAVES OPEN ANY
FILES IT OPENED, THEY WILL BE CLOSED BY THE SYSTEM BEFORE YOU ARE
REACTIVATED.
╞INALLY, BEFORE THE CALL IS MADE, YOU HAVE TO SAVE ANY VOLATILE LOCAL
INFORMATION INTO "FAR" MEMORY. ┴LL APPLICATION ZEROPAGE AND APPLICATION
AREA MEMORY WILL BE MODIFIED BY THE CALLED PROGRAM, SO YOU MUST SAVE
WHATEVER YOU WILL NEED TO CONTINUE AFTER THE RETURN TO BE ABLE TO
CONTINUE. ┴S MENTIONED EARLIER, ALL OF THE "FAR" MEMORY THAT A PARENT
PROGRAM OWNS WILL BE SAFE, SO YOU CAN SAVE YOUR VOLATILE INFORMATION
THERE, IN ANY FORMAT YOU WISH. ┴LL YOU HAVE TO DO IS SAVE THE POINTER
TO THE FAR MEMORY INTO THE [MP] POINTER. ╒PON RETURN OF THE CHILD
PROCESS, THE VALUE YOU PUT INTO [MP] WILL BE RESTORED, AND YOU CAN THEN
RESTORE YOUR VOLATILE INFORMATION OUT OF FAR STORAGE. ╔F YOU WISH TO
SAVE NO VOLATILE INFORMATION, THEN YOU CAN JUST LEAVE GARBAGE IN THE
[MP] VALUE, SINCE IT WILL NOT BE INTERPRETED BY THE SYSTEM.
┴LRIGHT, SO NOW YOU CALL THE "EXEC" PRIMITIVE, THE CHILD PROGRAM IS
LOADED, EXECUTED, AND IT RETURNS.
┴T THIS TIME, THE PARENT PROGRAM (THAT'S YOU) IS RELOADED FROM WHEREVER
IT WAS LOADED ORIGINALLY AND YOU ARE RETURNED TO THE INSTRUCTION
IMMEDIATELY FOLLOWING THE "JSR EXEC", WITH YOUR PROCESSOR STACK INTACT
BUT THE REST OF YOUR VOLATILE STORAGE INVALID. ┼VEN IF THERE IS AN
ERROR RETURN (CARRY FLAG SET), YOUR VOLATILE STORAGE WILL STILL NEED TO
BE RESTORED, SINCE THE APPLICATION AREA MAY HAVE BEEN OVERWRITTEN BEFORE
THE ERROR WAS DISCOVERED. ╔N THE CASE OF AN ERROR RETURN, THE CHILD
PROCESS WILL NOT HAVE BEEN EXECUTED. ╔F THE SYSTEM IS UNABLE TO RELOAD
THE PARENT PROGRAM (YOU), THEN AN ERROR RETURN IS GIVEN TO YOUR PARENT,
AND SO ON, AS FAR BACK AS NECESSARY. (╘HIS IS A MINOR EXCEPTION TO THE
RULE THAT AN ERROR RETURN INDICATES THAT A CHILD DIDN'T EXECUTE; IN THIS
CASE, THE CHILD DIDN'T COMPLETE).
┘OU ARE ALSO RETURNED AN "EXIT CODE", WHICH WILL HAVE
APPLICATION-SPECIFIC MEANING, ALTHOUGH STANDARD PROGRAMS (E.G., SHELL
SCRIPT) INTERPRET THE VALUE AS: 0==NORMAL EXIT, ANYTHING ELSE==ERROR
EXIT. ╘HE ╪ REGISTER IS ALSO SET TO INDICATE THE AMOUNT OF
"ACE┼XIT─ATA" THAT IS USED, TO ALLOW FOR MORE COMPLICATED RETURN VALUES.
[╬OTE: ╘HIS CALL IS DIFFERENT IN ╥ELEASE #9].
╬┴═┼ : EXECSUB
╨╒╥╨╧╙┼: EXECUTE INTERNAL SUBROUTINE AS A SEPARATE PROCESS
┴╥╟╙ : (ZP) = ADDRESS OF SUBROUTINE
(ZW) = ADDRESS OF ARGUMENT VECTOR
╥┼╘╒╥╬╙: .┴ = EXIT CODE
.╪ = NUMBER OF BYTES IN "ACE┼XIT─ATA" USED
.├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┘, ERRNO
╘HIS CALL IS VERY SIMILAR TO "EXEC", EXCEPT THAT IT CALLS AN INTERNAL
SUBROUTINE RATHER THAN AN EXTERNAL PROGRAM. ╘HUS, YOU DON'T HAVE TO
SAVE OR RESTORE YOUR VOLATILE STORAGE, OR WORRY ABOUT LOADING THE CHILD
OR RELOADING THE PARENT. ┘OU DO, HOWEVER, SET UP THE ARGUMENTS AND FILE
REDIRECTIONS AS YOU WOULD FOR A FULL "EXEC". [╬OTE: THIS CALL IS
DIFFERENT IN ╥ELEASE #9].
╬┴═┼ : EXIT
╨╒╥╨╧╙┼: EXIT CURRENT PROGRAM, RETURN TO PARENT
┴╥╟╙ : .┴ = EXIT CODE
.╪ = NUMBER OF BYTES IN "ACE┼XIT─ATA" USED
╥┼╘╒╥╬╙: <THERE IS NO RETURN, BRAH-HA-HA-HA-HA-HA!!!>
┴╠╘┼╥╙ : <DON'T BLOODY WELL MATTER>
╘HIS CALL CAUSES THE CURRENT PROGRAM TO EXIT BACK TO ITS PARENT. ┴
PROGRAM THAT EXITS SIMPLY BY RETURNING TO ITS ENVIRONMENT WILL GIVE BACK
AN EXIT CODE OF 0, WHICH SHOULD BE INTERPRETED AS A NORMAL RETURN. ╔F
YOU WISH TO INDICATE A SPECIAL RETURN, YOU SHOULD USE SOME EXIT CODE
OTHER THAN ZERO. ═ANY UTILITIES WILL INTERPRET NON-ZERO ERROR CODES AS
ACTUAL ERRORS AND MAY ABORT FURTHER OPERATIONS BECAUSE OF THIS.
┘OU MAY SET UP A RETURN DATA IN "ACE┼XIT─ATA", UP TO 255 BYTES WORTH,
AND LOAD THE NUMBER OF BYTES USED INTO .╪ IF YOU WISH. ╔T IS
RECOMMENDED THAT THE FIRST FIELD OF THIS DATA BE A SPECIAL IDENTIFIER
CODE SO PROGRAMS THAT CANNOT INTERPRET YOUR DATA WILL NOT TRY. ┘OU
CANNOT GIVE ANY FAR POINTERS IN YOUR RETURN DATA, SINCE ALL FAR MEMORY
ALLOCATED TO YOU WILL BE FREED BY THE SYSTEM BEFORE RETURNING TO YOUR
PARENT.
╬┴═┼ : MEMSTAT
╨╒╥╨╧╙┼: GET "FAR" MEMORY STATUS PLUS PROCESS ID
┴╥╟╙ : <NONE>
╥┼╘╒╥╬╙: .┴ = CURRENT PROCESS ID
[SW+0]= AMOUNT OF "FAR" MEMORY FREE
[SW+4]= TOTAL AMOUNT OF "FAR" MEMORY
┴╠╘┼╥╙ : .╪, .┘
╘HIS CALL RETURNS THE CURRENT PROCESS ID, THE NUMBER OF BYTES OF FAR
MEMORY CURRENTLY FREE, AND THE TOTAL AMOUNT OF FAR MEMORY.
2.7. ═╔╙├┼╠╠┴╬┼╧╒╙ ├┴╠╠╙
╬┴═┼ : UTOA
╨╒╥╨╧╙┼: CONVERT UNSIGNED 32-BIT NUMBER TO A DECIMAL ╨┼╘╙├╔╔ STRING
┴╥╟╙ : .┴ = MINIMUM LENGTH FOR RETURN STRING
.╪ = ZERO-PAGE ADDRESS OF 32-BIT NUMBER
(SW+0)= POINTER TO STRING BUFFER TO STORE STRING
╥┼╘╒╥╬╙: .┘ = LENGTH OF STRING
┴╠╘┼╥╙ : .┴, .╪
╘HIS IS A UTILITY CALL IN THE KERNEL. ╔T IS REALLY NOT NECESSARY FOR IT
TO BE IN THE KERNEL, BUT SO MANY PROGRAMS MAKE USE OF IT THAT IT MAKES
SENSE FOR IT TO BE FACTORED OUT. ┘OU GIVE A POINTER TO A 32-BIT
UNSIGNED VALUE IN ZERO PAGE MEMORY, A POINTER TO A BUFFER TO STORE THAT
STRING THAT IS AT LEAST AS LONG AS NECESSARY TO STORE THE VALUE PLUS THE
NULL-CHARACTER TERMINATOR THAT WILL BE PUT ON THE END OF THE STRING, AND
A MINIMUM LENGTH VALUE FOR THE STRING. ╔F THE NUMBER REQUIRES FEWER
DIGITS THAN THE MINIMUM LENGTH, THE STRING WILL BE PADDED WITH SPACES ON
THE LEFT. ╙INCE A 32-BIT QUANTITY CAN ONLY CONTAIN AN MAXIMUM OF TEN
DECIMAL DIGITS, THE STRING BUFFER WILL ONLY NEED TO BE A MAXIMUM OF
ELEVEN BYTES IN SIZE.
╬┴═┼ : GETDATE
╨╒╥╨╧╙┼: GET THE CURRENT DATE AND TIME
┴╥╟╙ : (.┴┘) = ADDRESS OF BUFFER TO PUT ┬├─-FORMAT DATE INTO
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
╥ETURNS THE CURRENT DATE AND TIME IN THE ┬├─ FORMAT DESCRIBED IN THE
PARAGRAPH ON "ACE─IRENT─ATE". ╔T PUTS IT INTO THE AT-LEAST-EIGHT-BYTE
STORAGE AREA POINTED TO BY (.┴┘).
╬┴═┼ : SETDATE
╨╒╥╨╧╙┼: SET THE CURRENT DATE AND TIME
┴╥╟╙ : (.┴┘) = ADDRESS OF DATE IN ┬├─ FORMAT
╥┼╘╒╥╬╙: <NONE>
┴╠╘┼╥╙ : .┴, .╪, .┘
╙ETS THE CURRENT DATE AND TIME IN THE SYSTEM. (.┴┘) POINTS TO THE ┬├─
DATE STRING WHOSE FORMAT IS DISCUSSED IN THE PARAGRAPH ON
"ACE─IRENT─ATE". ╬O VALIDITY CHECKING IS PERFORMED ON THE DATE GIVEN.
╬┴═┼ : CMDOPEN
╨╒╥╨╧╙┼: OPEN COMMAND CHANNEL TO ├OMMODORE DISK DRIVES
┴╥╟╙ : (ZP) = DEVICE NAME
╥┼╘╒╥╬╙: .┴ = FILE DESCRIPTOR NUMBER
.├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .╪, .┘, ERRNO
╘HIS "CMD" SET OF SYSTEM CALLS REALLY SHOULD NOT BE PRESENT, BUT THEY
WILL BE NEEDED UNTIL THE FULL COMPLEMENT OF DISK-UTILITY SYSTEM CALLS
ARE IMPLEMENTED. ╔T IS REALLY NOT RECOMMENDED THAT ANY APPLICATION
PROGRAM RELY ON THESE CALLS BEING AROUND VERY LONG. ╘HIS CALL OPENS THE
COMMAND CHANNEL ON THE NAMED DEVICE (STANDARD ┴├┼ DEVICE NAME STRING)
AND RETURNS THE FILE DESCRIPTOR NUMBER TO USE THEREAFTER.
╬┴═┼ : CMDCLOSE
╨╒╥╨╧╙┼: CLOSE COMMAND CHANNEL TO ├OMMODORE DISK DRIVES
┴╥╟╙ : .┴ = FILE DESCRIPTOR NUMBER
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS CLOSES AN OPENED COMMAND CHANNEL TO A DISK DRIVE. ├LOSING THE
STATUS WILL ╬╧╘ AFFECT ANY OTHER OPEN FILES ON THE DISK UNIT AT THE
TIME.
╬┴═┼ : CMDSEND
╨╒╥╨╧╙┼: SEND COMMAND OVER COMMAND CHANNEL TO ├OMMODORE DISK DRIVES
┴╥╟╙ : .╪ = FILE DESCRIPTOR NUMBER
(.┴┘) = POINTER TO NULL-TERMINATED COMMAND STRING
╥┼╘╒╥╬╙: .├╙ = ERROR OCCURRED FLAG
┴╠╘┼╥╙ : .┴, .╪, .┘, ERRNO
╘HIS SENDS A COMMAND STRING TO A DISK DRIVE. ╙INCE A NULL-TERMINATED
STRING REPRESENTATION IS USED, NOT ALL ├OMMODORE/├═─-─╧╙ COMMANDS CAN BE
SENT, BUT THE IMPORTANT ONES CAN BE.
╬┴═┼ : CMDSTATUS
╨╒╥╨╧╙┼: RECEIVE CURRENT STATUS FROM COMMAND CHANNEL OF ├OMMODORE DISK DRIVES
┴╥╟╙ : .╪ = FILE DESCRIPTOR NUMBER
(.┴┘) = POINTER TO BUFFER FOR NULL-TERMINATED STATUS STRING
╥┼╘╒╥╬╙: .┴ = STATUS CODE IN BINARY
.├╙ = ERROR OCCURRED
┴╠╘┼╥╙ : .╪, .┘, ERRNO
╘HIS RETURNS THE STATUS OF A DISK DRIVE IN A STRING AS WELL AS THE
BINARY DISK STATUS NUMBER IN THE ACCUMULATOR. ╘HE GIVEN STATUS BUFFER
MUST BE AT LEAST 50 OR SO CHARACTERS LONG (WHATEVER IS THE LONGEST
POSSIBLE DISK STATUS STRING).
3. ╒╙┼╥ ╨╥╧╟╥┴═ ╧╥╟┴╬╔┌┴╘╔╧╬
╘HE ┴├┼ SYSTEM ITSELF IS WRITTEN USING THE ┬UDDY-128 ASSEMBLER, SO IT IS
RECOMMENDED THAT APPLICATIONS BE WRITTEN IN THIS ALSO. ╒SER PROGRAMS
FOR ┴├┼ HAVE A VERY SIMPLE STRUCTURE. ╚ERE IS THE STANDARD "HELLO,
WORLD" EXAMPLE PROGRAM WRITTEN IN ┬UDDY ASSEMBLER FOR ┴├┼:
-----=-----
.SEQ ACEHEAD.S
.ORG ACE┴PP┴DDRESS
.OBJ "@0:HELLO"
JMP MAIN
.BYTE ACE╔─1,ACE╔─2,ACE╔─3
MAIN = *
LDA #<HELLO═SG
LDY #>HELLO═SG
STA ZP+0
STY ZP+1
LDA #<HELLO═SG┼ND-HELLO═SG
LDY #>HELLO═SG┼ND-HELLO═SG
LDX #STDOUT
JSR WRITE
RTS
HELLO═SG = *
.ASC "╚ELLO, CRUEL WORLD."
.BYTE 13
HELLO═SG┼ND = *
-----=-----
╘HIS WOULD NORMALLY BE PUT INTO A FILE CALLED "HELLO.S". ╘HE ".S"
EXTENSION MEANS THAT THIS IS AN ASSEMBLER FILE (A LA ╒NIX). ╘HE FIRST
THING THIS PROGRAM DOES IS INCLUDE THE "ACEHEAD.S" FILE. ╘HIS IS THE
┬UDDY ASSEMBLER FILE THAT CONTAINS THE HEADER INFORMATION DECLARATIONS
REQUIRED TO ACCESS THE ┴├┼ SYSTEM INTERFACE. ╘HE NEXT LINE GIVES THE
START ADDRESS TO START ASSEMBLING TO; IT MUST BE "ACE┴PP┴DDRESS", WHICH
IS THE ADDRESS THAT ┴├┼ WILL LOAD THE PROGRAM AT. ╘HE NEXT LINE IS A
DIRECTIVE TO THE ASSEMBLER TO WRITE THE EXECUTABLE CODE TO A
├OMMODORE-─╧╙ "╨╥╟" FILE NAMED "HELLO". ╘HIS WILL BE THE COMMAND TO
ENTER AT THE ┴├┼ SHELL PROMPT.
╘HE NEXT SIX BYTES OF OBJECT CODE (WHICH ARE THE FIRST SIX BYTES OF A
PROGRAM) DESCRIBE THE HEADER REQUIRED BY ┴├┼ PROGRAMS. ╘HE FIRST THREE
BYTES MUST BE A ╩═╨ TO THE MAIN ROUTINE OF THE PROGRAM. ╘HE NEXT THREE
BYTES MUST HAVE THE VALUES "ACE╔─1", "ACE╔─2", AND "ACE╔─3",
RESPECTIVELY. ┴ND THAT'S ALL THERE IS TO IT. ╘HE REST OF THE PROGRAM
CAN BE ORGANIZED HOWEVER YOU WANT IT TO BE.
╔N THIS EXAMPLE, WE SET UP THE ARGUMENTS FOR THE "WRITE" SYSTEM CALL TO
PRINT THE STRING "╚ELLO, CRUEL WORLD." PLUS A CARRIAGE RETURN TO
STANDARD OUTPUT. ╬OTE THAT THIS STRING DOES NOT NEED A TERMINATING NULL
($00) CHARACTER SINCE THE WRITE CALL TAKES A BUFFER LENGTH. ╘HE PROGRAM
THEN RETURNS TO ITS CALLING ENVIRONMENT VIA AN ╥╘╙. ╘HIS WILL CAUSE AN
IMPLIED "EXIT(0)" TO BE PERFORMED BY THE SYSTEM, RETURNING TO THE PARENT
PROGRAM.
┴LTHOUGH THIS PROGRAM DOES NOT TAKE ADVANTAGE OF THIS, AN APPLICATION
PROGRAM MAY USE ZERO-PAGE LOCATIONS $0002 THROUGH $007F FOR STORAGE
WITHOUT FEAR OF HAVING THE STORAGE TRODDEN UPON BY THE SYSTEM. ┴LSO,
THE PROCESSOR STACK MAY BE USED FROM THE POINT IT WAS AT UPON ENTRY TO
YOUR PROGRAM ALL THE WAY DOWN TO THE BOTTOM. ╔ WILL BE DOING SOMETHING
ABOUT ENSURING THERE IS ALWAYS ENOUGH PROCESSOR SPACE FOR AN APPLICATION
TO USE IN THE FUTURE, BUT FOR NOW, ALL APPLICATIONS HAVE TO SHARE THE